package com.mlk.score.strategy;

import cn.hutool.core.date.DateUtil;
import com.google.common.collect.Lists;
import com.mlk.core.constants.Constant;
import com.mlk.engSystem.constant.SystemParam;
import com.mlk.engSystem.po.EngSysParam;
import com.mlk.engSystem.service.EngSysParamService;
import com.mlk.sign.mapper.EngSignMapper;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 积分策略
 * @author xulu
 */
@Component
public class ScoreStrategy {

    @Resource
    private EngSysParamService engSysParamService;

    @Resource
    private EngSignMapper engSignMapper;


    /**
     * 获取签到积分
     * @return
     */
    public int signScore(String  openId){
        // 获取系统的配置参数
        // 连续几天签到可以获取积分
        int days = this.engSysParamService.getIntValue(SystemParam.CAN_GET_SCORE_OF_DAYS);
        // 一次获取的积分的数量
        int score = this.engSysParamService.getIntValue(SystemParam.SIGN_SCORE);

        // 计算出日期集合
        List<String> daysStr = Lists.newArrayList();
        for (int i=1;i<=days;i++){
            daysStr.add(
                    DateUtil.format(DateUtils.addDays(new Date(),(-1)*i), Constant.SIMPLE_DATE_FORMAT));
        }

        if(daysStr.size() == 0){
            // 说明不需要连续签到,直接增加积分就好了
            return score;
        }


        // 查询openId 这个人是否是否在这些日子里面都签到过.
        return this.engSignMapper.selectCountInDays(daysStr,openId) == days ? score : 0;
    }

    /**
     * 计算售卖电池获取的积分
     * @return
     */
    public int sellScore(BigDecimal price){
        // 获取定义的系统参数,知道售卖价格和积分的兑换比例
        BigDecimal rate = this.engSysParamService.getBigDecimalValue(SystemParam.SELL_PRICE_SCORE);
        // 按照比例进行计算,向下取整
        BigDecimal result = price.multiply(rate);
        // 返回对应的int值
        return result.intValue();
    }
}
